Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | export const dynamic = "force-dynamic"; import { NextRequest, NextResponse } from 'next/server'; import { } from "next-auth"; import { prisma } from "@/lib/prisma"; import { z } from "zod"; import { withAdmin, withErrorHandling, successResponse, ApiError, ApiSuccessResponse, ApiErrorResponse } from "@/lib/api"; import { RouteContext } from "@/lib/api/middleware"; interface RouteParams { params: Promise<{ code: string }>; } const UpdateCodeSchema = z.object({ status: z .enum(["pending", "signed_up", "purchased", "rewarded", "disabled"]) .optional() }); /** * GET /api/admin/referrals/codes/[code] * Get code details with usage */ async function handleGet(_request: NextRequest, context: RouteContext | undefined): Promise<NextResponse<ApiSuccessResponse<unknown> | ApiErrorResponse>> { const { code } = await (context as RouteParams).params; const referral = await prisma.referral.findUnique({ where: { referralCode: code }, include: { program: true } }); if (!referral) { throw ApiError.notFound("Referral code"); } // Get referrer info const referrer = await prisma.user.findUnique({ where: { id: referral.referrerId }, select: { id: true, email: true, name: true } }); // Get referee info if exists let referee = null; if (referral.refereeId) { referee = await prisma.user.findUnique({ where: { id: referral.refereeId }, select: { id: true, email: true, name: true } }); } return successResponse({ id: referral.id, code: referral.referralCode, status: referral.status, referrer: referrer ? { id: referrer.id, email: referrer.email, name: referrer.name || "N/A" } : null, referee: referee ? { id: referee.id, email: referee.email, name: referee.name || "N/A" } : null, referrerRewarded: referral.referrerRewarded, refereeRewarded: referral.refereeRewarded, program: referral.program, createdAt: referral.createdAt }); } /** * PATCH /api/admin/referrals/codes/[code] * Update code status (enable/disable) */ async function handlePatch(request: NextRequest, context: RouteContext | undefined): Promise<NextResponse<ApiSuccessResponse<unknown> | ApiErrorResponse>> { const { code } = await (context as RouteParams).params; const body = await request.json(); const result = UpdateCodeSchema.safeParse(body); if (!result.success) { throw ApiError.validation("Invalid data", result.error.issues); } const validatedData = result.data; const referral = await prisma.referral.findUnique({ where: { referralCode: code } }); if (!referral) { throw ApiError.notFound("Referral code"); } const updatedReferral = await prisma.referral.update({ where: { referralCode: code }, data: { status: validatedData.status } }); return successResponse(updatedReferral); } /** * DELETE /api/admin/referrals/codes/[code] * Delete code */ async function handleDelete(_request: NextRequest, context: RouteContext | undefined): Promise<NextResponse<ApiSuccessResponse<unknown> | ApiErrorResponse>> { const { code } = await (context as RouteParams).params; const referral = await prisma.referral.findUnique({ where: { referralCode: code } }); if (!referral) { throw ApiError.notFound("Referral code"); } // Don't allow deleting codes that have been used if (referral.refereeId || referral.status !== "pending") { throw ApiError.badRequest("Cannot delete a used referral code"); } await prisma.referral.delete({ where: { referralCode: code } }); return successResponse({ message: "Referral code deleted successfully" }); } export const GET = withErrorHandling(withAdmin(handleGet)); export const PATCH = withErrorHandling(withAdmin(handlePatch)); export const DELETE = withErrorHandling(withAdmin(handleDelete)); |